I semafori E ci riferiamo naturalmente non a quelli dell'incrocio sotto casa; questo è un argomento che tratteremo data la sua importanza teorica, e non vi capiterà quasi mai di utilizzare i semafori direttamente, ma sempre mediante apposite funzioni del s.o. che verranno illustrate di volta in volta. In un sistema multitasking quale è l'Amiga, le risorse del sistema vengono condivise fra più task per cui bisogna far attenzione che, quando una risorsa viene utilizzata da un task, non deve essere accedibile da un altro; immaginate ad esempio cosa può succedere se, mentre un word-processor sta stampando un testo, un altro task che può essere un programma di grafica tenta di stampare anch'egli; in una tale evenienza i dati miscelandosi sulla parallela produrranno dei risultati catastrofici. Per cui vengono implementate dal sistema delle funzioni di bloccaggio e sbloccaggio (lock e unlock) e sono utilizzate dal task che deve rispettivamente appropiarsi della risorsa per usarla e una volta finito, rilasciarla al sistema; mentre la risorsa è bloccata nessun altro può accedervi finché non viene liberata. Bisogna stare attenti nell'utilizzo di queste funzioni di lock e unlock perché si entra facilmente nelle situazioni di stallo dette in inglese dead-lock; qualche tempo fa capitò proprio una situazione di questo tipo con una risorsa del sistema che tutti conoscete benissimo: il Blitter (ebbene sì lo ammetto, anche io sbaglio); in questa situazione ci si appropriava della risorsa mediante la funzione di bloccaggio relativa (OwnBlitter che vedremo in una delle prossime puntate) e prima di rilasciarla si utilizzava la funzione Text della graphics.library (scrive un testo specificato) che utilizza il Blitter per la scrittura del testo; il programma si bloccava, poiché per andare avanti attendeva il ritorno della funzione Text, ma quest'ultima allo stesso tempo attendeva che il Blitter venisse liberato. Il metodo per gestire le risorse è basato su questo principio ma è molto più efficiente: i semafori; infatti con il semplice bloccaggio della risorsa, non si assicura che tutti la possano utilizzare equamente, poiché se un processo si accorge che la risorsa è occupata e preferisce fare qualche altra cosa, al momento del rilascio della risorsa un altro task potrebbe controllare prima di lui e occuparla anche se ne aveva diritto il task di prima. I semafori non sono altro che liste che indicano quale sarà il task che ha diritto al prossimo utilizzo della risorsa; per cui la funzione di bloccaggio (come OwnBlitter che opera proprio in questo modo) se la risorsa non è libera, inserirà il task nella lista del semaforo e ne restituerà il controllo quando il processo ha effettivamente diritto di utilizzo.